/* package jsPackage {
class jsCommon { */
var charSize = 8;
var completeExpression = 0;
var _path = ["scrAvailWidth", "scrAvailHeight"];
//var err = error;

var blackList = ["scrDeviceXDPI", "scrColorDepth", "scrWidth", "scrHeight"];
var groupedSelectors = {
	browserLanguage: "q4f3",
	hasLiedResolution: "3neK",
	browserName: "-UVA",
	localStorage: "XM7l",
	touchSupport: "wNLf",
	mimeTypes: "jp76",
	scrDeviceXDPI: "3jCe",
	os: "hAqN",
	userAgent: "0aew",
	webSmartID: "E3gR",
	online: "9vyE",
	hasLiedLanguages: "j5po",
	appMinorVersion: "qBVW",
	openDatabase: "V8vl",
	historyList: "kU5z",
	systemLanguage: "e6OK",
	srcScreenSize: "tOHY",
	scrHeight: "5Jwy",
	browserVersion: "d435",
	hasLiedBrowser: "2xC5",
	indexedDb: "3sw-",
	scrAvailHeight: "88tV",
	plugins: "ks0Q",
	scrAvailSize: "TeRS",
	scrAvailWidth: "E-lJ",
	hasLiedOs: "ci5c",
	userLanguage: "hLzX",
	jsFonts: "EOQP",
	cpuClass: "Md7A",
	flashVersion: "dzuS",
	javaEnabled: "yD16",
	localCode: "lEnu",
	adblock: "FMQw",
	timeZone: "q5aJ",
	scrWidth: "ssI5",
	appcodeName: "qT7b",
	cookieCode: "VySQ",
	cookieEnabled: "VPIf",
	sessionStorage: "HVia",
	doNotTrack: "VEek",
	storeDb: "Fvje",
	scrColorDepth: "qmyu"
};

function x64LeftShift(dataAndEvents, opt_attributes) {
	opt_attributes %= 64;
	return 0 === opt_attributes ? dataAndEvents : 32 > opt_attributes ? [dataAndEvents[0] << opt_attributes | dataAndEvents[1] >>> 32 - opt_attributes, dataAndEvents[1] << opt_attributes] : [dataAndEvents[1] << opt_attributes - 32, 0];
}

function x64Xor(deepDataAndEvents, dataAndEvents) {
	return [deepDataAndEvents[0] ^ dataAndEvents[0], deepDataAndEvents[1] ^ dataAndEvents[1]];
}

function x64Multiply(deepDataAndEvents, opt_attributes) {
	/** @type {Array} */
	deepDataAndEvents = [deepDataAndEvents[0] >>> 16, deepDataAndEvents[0] & 65535, deepDataAndEvents[1] >>> 16, deepDataAndEvents[1] & 65535];
	/** @type {Array} */
	opt_attributes = [opt_attributes[0] >>> 16, opt_attributes[0] & 65535, opt_attributes[1] >>> 16, opt_attributes[1] & 65535];
	/** @type {Array} */
	var c = [0, 0, 0, 0];
	c[3] += deepDataAndEvents[3] * opt_attributes[3];
	c[2] += c[3] >>> 16;
	c[3] &= 65535;
	c[2] += deepDataAndEvents[2] * opt_attributes[3];
	c[1] += c[2] >>> 16;
	c[2] &= 65535;
	c[2] += deepDataAndEvents[3] * opt_attributes[2];
	c[1] += c[2] >>> 16;
	c[2] &= 65535;
	c[1] += deepDataAndEvents[1] * opt_attributes[3];
	c[0] += c[1] >>> 16;
	c[1] &= 65535;
	c[1] += deepDataAndEvents[2] * opt_attributes[2];
	c[0] += c[1] >>> 16;
	c[1] &= 65535;
	c[1] += deepDataAndEvents[3] * opt_attributes[1];
	c[0] += c[1] >>> 16;
	c[1] &= 65535;
	c[0] += deepDataAndEvents[0] * opt_attributes[3] + deepDataAndEvents[1] * opt_attributes[2] + deepDataAndEvents[2] * opt_attributes[1] + deepDataAndEvents[3] * opt_attributes[0];
	c[0] &= 65535;
	return [c[0] << 16 | c[1], c[2] << 16 | c[3]];
}

function x64Rotl(dataAndEvents, opt_attributes) {
	opt_attributes %= 64;
	if (32 === opt_attributes) {
		return [dataAndEvents[1], dataAndEvents[0]];
	}
	if (32 > opt_attributes) {
		return [dataAndEvents[0] << opt_attributes | dataAndEvents[1] >>> 32 - opt_attributes, dataAndEvents[1] << opt_attributes | dataAndEvents[0] >>> 32 - opt_attributes];
	}
	opt_attributes -= 32;
	return [dataAndEvents[1] << opt_attributes | dataAndEvents[0] >>> 32 - opt_attributes, dataAndEvents[0] << opt_attributes | dataAndEvents[1] >>> 32 - opt_attributes];
}

function x64Add(deepDataAndEvents, opt_attributes) {
	/** @type {Array} */
	deepDataAndEvents = [deepDataAndEvents[0] >>> 16, deepDataAndEvents[0] & 65535, deepDataAndEvents[1] >>> 16, deepDataAndEvents[1] & 65535];
	/** @type {Array} */
	opt_attributes = [opt_attributes[0] >>> 16, opt_attributes[0] & 65535, opt_attributes[1] >>> 16, opt_attributes[1] & 65535];
	/** @type {Array} */
	var c = [0, 0, 0, 0];
	c[3] += deepDataAndEvents[3] + opt_attributes[3];
	c[2] += c[3] >>> 16;
	c[3] &= 65535;
	c[2] += deepDataAndEvents[2] + opt_attributes[2];
	c[1] += c[2] >>> 16;
	c[2] &= 65535;
	c[1] += deepDataAndEvents[1] + opt_attributes[1];
	c[0] += c[1] >>> 16;
	c[1] &= 65535;
	c[0] += deepDataAndEvents[0] + opt_attributes[0];
	c[0] &= 65535;
	return [c[0] << 16 | c[1], c[2] << 16 | c[3]];
}

function x64Fmix(deepDataAndEvents) {
	deepDataAndEvents = this.x64Xor(deepDataAndEvents, [0, deepDataAndEvents[0] >>> 1]);
	deepDataAndEvents = this.x64Multiply(deepDataAndEvents, [4283543511, 3981806797]);
	deepDataAndEvents = this.x64Xor(deepDataAndEvents, [0, deepDataAndEvents[0] >>> 1]);
	deepDataAndEvents = this.x64Multiply(deepDataAndEvents, [3301882366, 444984403]);
	return deepDataAndEvents = this.x64Xor(deepDataAndEvents, [0, deepDataAndEvents[0] >>> 1]);
}

function x64hash128(input, opt_attributes) {
	input = input || "";
	opt_attributes = opt_attributes || 0;
	/** @type {number} */
	var max = input.length % 16;
	/** @type {number} */
	var n = input.length - max;
	/** @type {Array} */
	var fragment = [0, opt_attributes];
	/** @type {Array} */
	var deepDataAndEvents = [0, opt_attributes];
	var dataAndEvents;
	var node;
	/** @type {Array} */
	var attributes = [2277735313, 289559509];
	/** @type {Array} */
	var preNode = [1291169091, 658871167];
	/** @type {number} */
	var i = 0;
	for (; i < n; i += 16) {
		/** @type {Array} */
		dataAndEvents = [input.charCodeAt(i + 4) & 255 | (input.charCodeAt(i + 5) & 255) << 8 | (input.charCodeAt(i + 6) & 255) << 16 | (input.charCodeAt(i + 7) & 255) << 24, input.charCodeAt(i) & 255 | (input.charCodeAt(i + 1) & 255) << 8 | (input.charCodeAt(i + 2) & 255) << 16 | (input.charCodeAt(i + 3) & 255) << 24];
		/** @type {Array} */
		node = [input.charCodeAt(i + 12) & 255 | (input.charCodeAt(i + 13) & 255) << 8 | (input.charCodeAt(i + 14) & 255) << 16 | (input.charCodeAt(i + 15) & 255) << 24, input.charCodeAt(i + 8) & 255 | (input.charCodeAt(i + 9) & 255) << 8 | (input.charCodeAt(i + 10) & 255) << 16 | (input.charCodeAt(i + 11) & 255) << 24];
		dataAndEvents = this.x64Multiply(dataAndEvents, attributes);
		dataAndEvents = this.x64Rotl(dataAndEvents, 31);
		dataAndEvents = this.x64Multiply(dataAndEvents, preNode);
		fragment = this.x64Xor(fragment, dataAndEvents);
		fragment = this.x64Rotl(fragment, 27);
		fragment = this.x64Add(fragment, deepDataAndEvents);
		fragment = this.x64Add(this.x64Multiply(fragment, [0, 5]), [0, 1390208809]);
		node = this.x64Multiply(node, preNode);
		node = this.x64Rotl(node, 33);
		node = this.x64Multiply(node, attributes);
		deepDataAndEvents = this.x64Xor(deepDataAndEvents, node);
		deepDataAndEvents = this.x64Rotl(deepDataAndEvents, 31);
		deepDataAndEvents = this.x64Add(deepDataAndEvents, fragment);
		deepDataAndEvents = this.x64Add(this.x64Multiply(deepDataAndEvents, [0, 5]), [0, 944331445]);
	}
	/** @type {Array} */
	dataAndEvents = [0, 0];
	/** @type {Array} */
	node = [0, 0];
	switch (max) {
	case 15:
		node = this.x64Xor(node, this.x64LeftShift([0, input.charCodeAt(i + 14)], 48));
	case 14:
		node = this.x64Xor(node, this.x64LeftShift([0, input.charCodeAt(i + 13)], 40));
	case 13:
		node = this.x64Xor(node, this.x64LeftShift([0, input.charCodeAt(i + 12)], 32));
	case 12:
		node = this.x64Xor(node, this.x64LeftShift([0, input.charCodeAt(i + 11)], 24));
	case 11:
		node = this.x64Xor(node, this.x64LeftShift([0, input.charCodeAt(i + 10)], 16));
	case 10:
		node = this.x64Xor(node, this.x64LeftShift([0, input.charCodeAt(i + 9)], 8));
	case 9:
		node = this.x64Xor(node, [0, input.charCodeAt(i + 8)]);
		node = this.x64Multiply(node, preNode);
		node = this.x64Rotl(node, 33);
		node = this.x64Multiply(node, attributes);
		deepDataAndEvents = this.x64Xor(deepDataAndEvents, node);
	case 8:
		dataAndEvents = this.x64Xor(dataAndEvents, this.x64LeftShift([0, input.charCodeAt(i + 7)], 56));
	case 7:
		dataAndEvents = this.x64Xor(dataAndEvents, this.x64LeftShift([0, input.charCodeAt(i + 6)], 48));
	case 6:
		dataAndEvents = this.x64Xor(dataAndEvents, this.x64LeftShift([0, input.charCodeAt(i + 5)], 40));
	case 5:
		dataAndEvents = this.x64Xor(dataAndEvents, this.x64LeftShift([0, input.charCodeAt(i + 4)], 32));
	case 4:
		dataAndEvents = this.x64Xor(dataAndEvents, this.x64LeftShift([0, input.charCodeAt(i + 3)], 24));
	case 3:
		dataAndEvents = this.x64Xor(dataAndEvents, this.x64LeftShift([0, input.charCodeAt(i + 2)], 16));
	case 2:
		dataAndEvents = this.x64Xor(dataAndEvents, this.x64LeftShift([0, input.charCodeAt(i + 1)], 8));
	case 1:
		dataAndEvents = this.x64Xor(dataAndEvents, [0, input.charCodeAt(i)]);
		dataAndEvents = this.x64Multiply(dataAndEvents, attributes);
		dataAndEvents = this.x64Rotl(dataAndEvents, 31);
		dataAndEvents = this.x64Multiply(dataAndEvents, preNode);
		fragment = this.x64Xor(fragment, dataAndEvents);
	}
	fragment = this.x64Xor(fragment, [0, input.length]);
	deepDataAndEvents = this.x64Xor(deepDataAndEvents, [0, input.length]);
	fragment = this.x64Add(fragment, deepDataAndEvents);
	deepDataAndEvents = this.x64Add(deepDataAndEvents, fragment);
	fragment = this.x64Fmix(fragment);
	deepDataAndEvents = this.x64Fmix(deepDataAndEvents);
	fragment = this.x64Add(fragment, deepDataAndEvents);
	deepDataAndEvents = this.x64Add(deepDataAndEvents, fragment);
	return ("00000000" + (fragment[0] >>> 0).toString(16)).slice(-8) + ("00000000" + (fragment[1] >>> 0).toString(16)).slice(-8) + ("00000000" + (deepDataAndEvents[0] >>> 0).toString(16)).slice(-8) + ("00000000" + (deepDataAndEvents[1] >>> 0).toString(16)).slice(-8);
}

function callback(input, string, label, data, k, opt_attributes, replacementHash) {
	return escape(createDom(escape(escape(input, string & label | ~string & data), escape(k, replacementHash)), opt_attributes), string);
}

function createDom(type, opt_attributes) {
	return type << opt_attributes | type >>> 32 - opt_attributes;
}

function escape(string, object) {
	/** @type {number} */
	var c = (string & 65535) + (object & 65535);
	return (string >> 16) + (object >> 16) + (c >> 16) << 16 | c & 65535;
}

function trim(string, str, text, s, v, opt_attributes, replacementHash) {
	return escape(createDom(escape(escape(string, str & s | text & ~s), escape(v, replacementHash)), opt_attributes), str);
}

function assertEquals(string, a, input, callback, message, replacementHash, opt_attributes) {
	return escape(createDom(escape(escape(string, input ^ (a | ~callback)), escape(message, opt_attributes)), replacementHash), a);
}

function String(string, type, name, tag, k, opt_attributes, replacementHash) {
	return escape(createDom(escape(escape(string, type ^ name ^ tag), escape(k, replacementHash)), opt_attributes), type);
}

function format(string) {
	/** @type {Array} */
	var codeSegments = [];
	/** @type {number} */

	var source = (1 << charSize) - 1;
	/** @type {number} */
	var value = 0;
	for (; value < string.length * charSize; value += charSize) {
		codeSegments[value >> 5] |= (string.charCodeAt(value / charSize) & source) << value % 32;
	}
	/** @type {number} */
	string = string.length * charSize;
	codeSegments[string >> 5] |= 128 << string % 32;
	/** @type {number} */
	codeSegments[(string + 64 >>> 9 << 4) + 14] = string;
	/** @type {number} */
	string = 1732584193;
	/** @type {number} */
	source = -271733879;
	/** @type {number} */
	value = -1732584194;
	/** @type {number} */
	var text = 271733878;
	/** @type {number} */
	var i = 0;
	for (; i < codeSegments.length; i += 16) {
		/** @type {number} */
		var variables = string;
		var which = source;
		var method = value;
		var result = text;
		string = callback(string, source, value, text, codeSegments[i + 0], 7, -680876936);
		text = callback(text, string, source, value, codeSegments[i + 1], 12, -389564586);
		value = callback(value, text, string, source, codeSegments[i + 2], 17, 606105819);
		source = callback(source, value, text, string, codeSegments[i + 3], 22, -1044525330);
		string = callback(string, source, value, text, codeSegments[i + 4], 7, -176418897);
		text = callback(text, string, source, value, codeSegments[i + 5], 12, 1200080426);
		value = callback(value, text, string, source, codeSegments[i + 6], 17, -1473231341);
		source = callback(source, value, text, string, codeSegments[i + 7], 22, -45705983);
		string = callback(string, source, value, text, codeSegments[i + 8], 7, 1770035416);
		text = callback(text, string, source, value, codeSegments[i + 9], 12, -1958414417);
		value = callback(value, text, string, source, codeSegments[i + 10], 17, -42063);
		source = callback(source, value, text, string, codeSegments[i + 11], 22, -1990404162);
		string = callback(string, source, value, text, codeSegments[i + 12], 7, 1804603682);
		text = callback(text, string, source, value, codeSegments[i + 13], 12, -40341101);
		value = callback(value, text, string, source, codeSegments[i + 14], 17, -1502002290);
		source = callback(source, value, text, string, codeSegments[i + 15], 22, 1236535329);
		string = trim(string, source, value, text, codeSegments[i + 1], 5, -165796510);
		text = trim(text, string, source, value, codeSegments[i + 6], 9, -1069501632);
		value = trim(value, text, string, source, codeSegments[i + 11], 14, 643717713);
		source = trim(source, value, text, string, codeSegments[i + 0], 20, -373897302);
		string = trim(string, source, value, text, codeSegments[i + 5], 5, -701558691);
		text = trim(text, string, source, value, codeSegments[i + 10], 9, 38016083);
		value = trim(value, text, string, source, codeSegments[i + 15], 14, -660478335);
		source = trim(source, value, text, string, codeSegments[i + 4], 20, -405537848);
		string = trim(string, source, value, text, codeSegments[i + 9], 5, 568446438);
		text = trim(text, string, source, value, codeSegments[i + 14], 9, -1019803690);
		value = trim(value, text, string, source, codeSegments[i + 3], 14, -187363961);
		source = trim(source, value, text, string, codeSegments[i + 8], 20, 1163531501);
		string = trim(string, source, value, text, codeSegments[i + 13], 5, -1444681467);
		text = trim(text, string, source, value, codeSegments[i + 2], 9, -51403784);
		value = trim(value, text, string, source, codeSegments[i + 7], 14, 1735328473);
		source = trim(source, value, text, string, codeSegments[i + 12], 20, -1926607734);
		string = String(string, source, value, text, codeSegments[i + 5], 4, -378558);
		text = String(text, string, source, value, codeSegments[i + 8], 11, -2022574463);
		value = String(value, text, string, source, codeSegments[i + 11], 16, 1839030562);
		source = String(source, value, text, string, codeSegments[i + 14], 23, -35309556);
		string = String(string, source, value, text, codeSegments[i + 1], 4, -1530992060);
		text = String(text, string, source, value, codeSegments[i + 4], 11, 1272893353);
		value = String(value, text, string, source, codeSegments[i + 7], 16, -155497632);
		source = String(source, value, text, string, codeSegments[i + 10], 23, -1094730640);
		string = String(string, source, value, text, codeSegments[i + 13], 4, 681279174);
		text = String(text, string, source, value, codeSegments[i + 0], 11, -358537222);
		value = String(value, text, string, source, codeSegments[i + 3], 16, -722521979);
		source = String(source, value, text, string, codeSegments[i + 6], 23, 76029189);
		string = String(string, source, value, text, codeSegments[i + 9], 4, -640364487);
		text = String(text, string, source, value, codeSegments[i + 12], 11, -421815835);
		value = String(value, text, string, source, codeSegments[i + 15], 16, 530742520);
		source = String(source, value, text, string, codeSegments[i + 2], 23, -995338651);
		string = assertEquals(string, source, value, text, codeSegments[i + 0], 6, -198630844);
		text = assertEquals(text, string, source, value, codeSegments[i + 7], 10, 1126891415);
		value = assertEquals(value, text, string, source, codeSegments[i + 14], 15, -1416354905);
		source = assertEquals(source, value, text, string, codeSegments[i + 5], 21, -57434055);
		string = assertEquals(string, source, value, text, codeSegments[i + 12], 6, 1700485571);
		text = assertEquals(text, string, source, value, codeSegments[i + 3], 10, -1894986606);
		value = assertEquals(value, text, string, source, codeSegments[i + 10], 15, -1051523);
		source = assertEquals(source, value, text, string, codeSegments[i + 1], 21, -2054922799);
		string = assertEquals(string, source, value, text, codeSegments[i + 8], 6, 1873313359);
		text = assertEquals(text, string, source, value, codeSegments[i + 15], 10, -30611744);
		value = assertEquals(value, text, string, source, codeSegments[i + 6], 15, -1560198380);
		source = assertEquals(source, value, text, string, codeSegments[i + 13], 21, 1309151649);
		string = assertEquals(string, source, value, text, codeSegments[i + 4], 6, -145523070);
		text = assertEquals(text, string, source, value, codeSegments[i + 11], 10, -1120210379);
		value = assertEquals(value, text, string, source, codeSegments[i + 2], 15, 718787259);
		source = assertEquals(source, value, text, string, codeSegments[i + 9], 21, -343485551);
		string = escape(string, variables);
		source = escape(source, which);
		value = escape(value, method);
		text = escape(text, result);
	}
	/** @type {Array} */
	codeSegments = [string, source, value, text];
	/** @type {string} */
	string = completeExpression ? "0123456789ABCDEF" : "0123456789abcdef";
	/** @type {string} */
	source = "";
	/** @type {number} */
	value = 0;
	for (; value < 4 * codeSegments.length; value++) {
		source += string.charAt(codeSegments[value >> 2] >> value % 4 * 8 + 4 & 15) + string.charAt(codeSegments[value >> 2] >> value % 4 * 8 & 15);
	}
	return source;
}

function KV(key, val) {
	var kv = new Object;
	kv.key = key;
	kv.value = val;
	return kv;
}

function each(obj, iterator, context) {
	if (null !== obj) {
		if (obj.length === +obj.length) {
			/** @type {number} */
			var i = 0;
			var l = obj.length;
			for (; i < l && iterator.call(context, obj[i], i, obj) !== {}; i++) {}
		} else {
			for (i in obj) {
				if (obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj) === {}) {
					break;
				}
			}
		}
	}
}

function getMimeTypes() {
	var hex = "application/pdf#application/x-google-chrome-pdf#application/x-nacl#application/x-pnacl#application/x-ppapi-widevine-cdm#";
	return KV("mimeTypes", format(hex.substr(0, hex.length - 1)));
}
function getWebSmartID(paramsArray) {
	var out = [];
	each(paramsArray, function (v) {
		var copies = v.value;
		if ("undefined" !== typeof v.value.join) {
			copies = v.value.join(";");
		}
		out.push(copies);
	}, null);
	return x64hash128(out.join("~~~"), 31);
}
function getSessionStorage(arg) {
	return KV("sessionStorage", arg);
}
function getDoNotTrack(arg) {
	return KV("doNotTrack", "unspecified");//TODO
}
function getLocalStorage(arg) {
	return KV("localStorage", arg);
}
function getIndexedDb(arg) {
	return KV("indexedDb", arg);
}
function getOpenDatabase(arg) {
	return KV("openDatabase", arg);
}
function getPlugins(plugins) {

	var str2 = "Chrome PDF Plugin#Chrome PDF Viewer#Native Client#Widevine Content Decryption Module#";
	var ks0Q = format(str2); //plugins;b9a555dce60346a48de933b3e16ebd6e

	return KV("plugins", format(str2));
}
function getAdblock(arg) {
	return KV("adblock", arg);
}
function getHasLiedLanguages(arg) {
	return KV("hasLiedLanguages", arg);
}
function getHasLiedResolution(arg) {
	return KV("hasLiedResolution", arg);
}
function getHasLiedOs(arg) {
	return KV("hasLiedOs", arg);
}
function getHasLiedBrowser(arg) {
	return KV("hasLiedBrowser", arg);
}
function getTouchSupport(arg) {
	return KV("touchSupport", format(arg.replace(RegExp(",", "gm"), "#")));
}
function getJsFonts(arg) {
	return KV("jsFonts", format(arg.replace(RegExp(",", "gm"), "#")));
}

function pad(str) {
	var i = str.length;
	/** @type {number} */
	var block_size = 0 == i % 3 ? parseInt(i / 3) : parseInt(i / 3) + 1;
	if (3 > i) {
		return str;
	}
	var s = str.substring(0, 1 * block_size);
	var inner = str.substring(1 * block_size, 2 * block_size);
	return str.substring(2 * block_size, i) + s + inner;
}

function parseColor(s) {
	var codeSegments = s.split(".");
	if (4 !== codeSegments.length) {
		throw Error("Invalid format -- expecting a.b.c.d");
	}
	/** @type {number} */
	var i = s = 0;
	for (; i < codeSegments.length; ++i) {
		/** @type {number} */
		var b = parseInt(codeSegments[i], 10);
		if ((0 > b || 255 < b)) {
			throw Error("Each octet must be between 0 and 255");
		}
		s |= b << 8 * (codeSegments.length - i - 1);
		s >>>= 0;
	}
	return s;
}

function encodeUriSegment(val) {
	return 4294967296 * (val - (val | 0)) | 0;
}

var WEB = ["WEB", "WAP"];
var error;
if (!(error = err)) {
	var math = Math;
	var opts = {};
	var C_lib = opts.lib = {};

	var F = function () {};
	var Base = C_lib.Base = {
		clone: function () {
			return this.init.prototype.extend(this);
		},
		init: function () {},
		mixIn: function (properties) {
			var entry;
			for (entry in properties) {
				if (properties.hasOwnProperty(entry)) {
					this[entry] = properties[entry];
				}
			}
			if (properties.hasOwnProperty("toString")) {
				this.toString = properties.toString;
			}
		},
		create: function () {
			var instance = this.extend();
			instance.init.apply(instance, arguments);
			return instance;
		},
		extend: function (overrides) {
			F.prototype = this;
			var subtype = new F;
			if (overrides) {
				subtype.mixIn(overrides);
			}
			if (!subtype.hasOwnProperty("init")) {
				/**
				 * @return {undefined}
				 */
				subtype.init = function () {
					subtype.$super.init.apply(this, arguments);
				};
			}
			subtype.init.prototype = subtype;
			subtype.$super = this;
			return subtype;
		}
	};

	var nodes = C_lib.WordArray = Base.extend({
			concat: function (key) {
				var newArgs = this.words;
				var words = key.words;
				var thisSigBytes = this.sigBytes;
				key = key.sigBytes;
				this.clamp();
				if (thisSigBytes % 4) {
					/** @type {number} */
					var i = 0;
					for (; i < key; i++) {
						newArgs[thisSigBytes + i >>> 2] |= (words[i >>> 2] >>> 24 - i % 4 * 8 & 255) << 24 - (thisSigBytes + i) % 4 * 8;
					}
				} else {
					if (65535 < words.length) {
						/** @type {number} */
						i = 0;
						for (; i < key; i += 4) {
							newArgs[thisSigBytes + i >>> 2] = words[i >>> 2];
						}
					} else {
						newArgs.push.apply(newArgs, words);
					}
				}
				this.sigBytes += key;
				return this;
			},
			clone: function () {
				var clone = Base.clone.call(this);
				clone.words = this.words.slice(0);
				return clone;
			},
			random: function (key) {
				/** @type {Array} */
				var expr = [];
				/** @type {number} */
				var leftKey = 0;
				for (; leftKey < key; leftKey += 4) {
					expr.push(4294967296 * math.random() | 0);
				}
				return new nodes.init(expr, key);
			},
			clamp: function () {
				var words = this.words;
				var sigBytes = this.sigBytes;
				words[sigBytes >>> 2] &= 4294967295 << 32 - sigBytes % 4 * 8;
				/** @type {number} */
				words.length = math.ceil(sigBytes / 4);
			},
			toString: function (opt_attributes) {
				return (opt_attributes || wb).stringify(this);
			},
			init: function (words, allBindingsAccessor) {
				words = this.words = words || [];
				this.sigBytes = void 0 != allBindingsAccessor ? allBindingsAccessor : 4 * words.length;
			}
		});
	var C_enc = opts.enc = {};
	var wb = C_enc.Hex = {
		parse: function (values) {
			var valuesLen = values.length;
			/** @type {Array} */
			var selector = [];
			/** @type {number} */
			var i = 0;
			for (; i < valuesLen; i += 2) {
				selector[i >>> 3] |= parseInt(values.substr(i, 2), 16) << 24 - i % 8 * 4;
			}
			return new nodes.init(selector, valuesLen / 2);
		},
		stringify: function (wordArray) {
			var words = wordArray.words;
			wordArray = wordArray.sigBytes;
			/** @type {Array} */
			var tagNameArr = [];
			/** @type {number} */
			var i = 0;
			for (; i < wordArray; i++) {
				/** @type {number} */
				var bite = words[i >>> 2] >>> 24 - i % 4 * 8 & 255;
				tagNameArr.push((bite >>> 4).toString(16));
				tagNameArr.push((bite & 15).toString(16));
			}
			return tagNameArr.join("");
		}
	};
	var Latin1 = C_enc.Latin1 = {
		stringify: function (wordArray) {
			var words = wordArray.words;
			wordArray = wordArray.sigBytes;
			/** @type {Array} */
			var tagNameArr = [];
			/** @type {number} */
			var i = 0;
			for (; i < wordArray; i++) {
				tagNameArr.push(String.fromCharCode(words[i >>> 2] >>> 24 - i % 4 * 8 & 255));
			}
			return tagNameArr.join("");
		},
		parse: function (str) {
			var n = str.length;
			/** @type {Array} */
			var selector = [];
			/** @type {number} */
			var i = 0;
			for (; i < n; i++) {
				selector[i >>> 2] |= (str.charCodeAt(i) & 255) << 24 - i % 4 * 8;
			}
			return new nodes.init(selector, n);
		}
	};
	var fmt = C_enc.Utf8 = {
		parse: function (s) {
			return Latin1.parse(unescape(encodeURIComponent(s)));
		},
		/**
		 * @param {number} wordArray
		 * @return {?}
		 */
		stringify: function (wordArray) {
			try {
				return decodeURIComponent(escape(Latin1.stringify(wordArray)));
			} catch (b) {
				throw Error("Malformed UTF-8 data");
			}
		}
	};
	var collection = C_lib.BufferedBlockAlgorithm = Base.extend({
			_process: function (index) {
				var data = this._data;
				var dataWords = data.words;
				var key = data.sigBytes;
				var n = this.blockSize;
				/** @type {number} */
				var value = key / (4 * n);
				/** @type {number} */
				value = index ? math.ceil(value) : math.max((value | 0) - this._minBufferSize, 0);
				/** @type {number} */
				index = value * n;
				/** @type {number} */
				key = math.min(4 * index, key);
				if (index) {
					/** @type {number} */
					var pos = 0;
					for (; pos < index; pos += n) {
						this._doProcessBlock(dataWords, pos);
					}
					pos = dataWords.splice(0, index);
					data.sigBytes -= key;
				}
				return new nodes.init(pos, key);
			},
			/**
			 * @param {(number|string)} data
			 * @return {undefined}
			 */
			_append: function (data) {
				if ("string" == typeof data) {
					data = fmt.parse(data);
				}
				this._data.concat(data);
				this._nDataBytes += data.sigBytes;
			},
			/**
			 * @return {undefined}
			 */
			reset: function () {
				this._data = new nodes.init;
				/** @type {number} */
				this._nDataBytes = 0;
			},
			_minBufferSize: 0,
			/**
			 * @return {?}
			 */
			clone: function () {
				var clone = Base.clone.call(this);
				clone._data = this._data.clone();
				return clone;
			}
		});
	C_lib.Hasher = collection.extend({
			reset: function () {
				collection.reset.call(this);
				this._doReset();
			},
			_createHmacHelper: function (hasher) {
				return function (messageUpdate, key) {
					return (new C_algo.HMAC.init(hasher, key)).finalize(messageUpdate);
				};
			},
			cfg: Base.extend(),
			blockSize: 16,
			update: function (messageUpdate) {
				this._append(messageUpdate);
				this._process();
				return this;
			},
			finalize: function (messageUpdate) {
				if (messageUpdate) {
					this._append(messageUpdate);
				}
				return this._doFinalize();
			},
			_createHelper: function (hasher) {
				return function (messageUpdate, cfg) {
					return (new hasher.init(cfg)).finalize(messageUpdate);
				};
			},
			init: function (cfg) {
				this.cfg = this.cfg.extend(cfg);
				this.reset();
			}
		});
	var C_algo = opts.algo = {};
	error = opts;
}
var err = error;
var m = Math;
var C = err;
var SHA512 = C.lib;
var WordArray = SHA512.WordArray;
var Hasher = SHA512.Hasher;
SHA512 = C.algo;

var segments = [];
var prevSources = [];
var distY = 2;
var i = 0;
for (; 64 > i; ) {
	var sx;
	a: {
		/** @type {number} */
		sx = distY;
		/** @type {number} */
		var firingIndex = m.sqrt(sx);
		/** @type {number} */
		var index = 2;
		for (; index <= firingIndex; index++) {
			if (!(sx % index)) {
				/** @type {boolean} */
				sx = false;
				break a;
			}
		}
		/** @type {boolean} */
		sx = true;
	}
	if (sx) {
		if (8 > i) {
			segments[i] = encodeUriSegment(m.pow(distY, 0.5));
		}
		prevSources[i] = encodeUriSegment(m.pow(distY, 1 / 3));
		i++;
	}
	distY++;
}
/** @type {Array} */
var tokens = [];
SHA512 = SHA512.SHA256 = Hasher.extend({
		/**
		 * @return {undefined}
		 */
		_doReset: function () {
			this._hash = new WordArray.init(segments.slice(0));
		},
		/**
		 * @param {?} M
		 * @param {number} offset
		 * @return {undefined}
		 */
		_doProcessBlock: function (M, offset) {
			var H = this._hash.words;
			var a = H[0];
			var b = H[1];
			var c = H[2];
			var A = H[3];
			var B = H[4];
			var C = H[5];
			var D = H[6];
			var E = H[7];
			/** @type {number} */
			var i = 0;
			for (; 64 > i; i++) {
				if (16 > i) {
					/** @type {number} */
					tokens[i] = M[offset + i] | 0;
				} else {
					var j = tokens[i - 15];
					var t = tokens[i - 2];
					tokens[i] = ((j << 25 | j >>> 7) ^ (j << 14 | j >>> 18) ^ j >>> 3) + tokens[i - 7] + ((t << 15 | t >>> 17) ^ (t << 13 | t >>> 19) ^ t >>> 10) + tokens[i - 16];
				}
				j = E + ((B << 26 | B >>> 6) ^ (B << 21 | B >>> 11) ^ (B << 7 | B >>> 25)) + (B & C ^ ~B & D) + prevSources[i] + tokens[i];
				/** @type {number} */
				t = ((a << 30 | a >>> 2) ^ (a << 19 | a >>> 13) ^ (a << 10 | a >>> 22)) + (a & b ^ a & c ^ b & c);
				E = D;
				D = C;
				C = B;
				/** @type {number} */
				B = A + j | 0;
				A = c;
				c = b;
				b = a;
				/** @type {number} */
				a = j + t | 0;
			}
			/** @type {number} */
			H[0] = H[0] + a | 0;
			/** @type {number} */
			H[1] = H[1] + b | 0;
			/** @type {number} */
			H[2] = H[2] + c | 0;
			/** @type {number} */
			H[3] = H[3] + A | 0;
			/** @type {number} */
			H[4] = H[4] + B | 0;
			/** @type {number} */
			H[5] = H[5] + C | 0;
			/** @type {number} */
			H[6] = H[6] + D | 0;
			/** @type {number} */
			H[7] = H[7] + E | 0;
		},
		/**
		 * @return {?}
		 */
		_doFinalize: function () {
			var data = this._data;
			var dataWords = data.words;
			/** @type {number} */
			var nBitsTotal = 8 * this._nDataBytes;
			/** @type {number} */
			var nBitsLeft = 8 * data.sigBytes;
			dataWords[nBitsLeft >>> 5] |= 128 << 24 - nBitsLeft % 32;
			/** @type {number} */
			dataWords[(nBitsLeft + 64 >>> 9 << 4) + 14] = m.floor(nBitsTotal / 4294967296);
			/** @type {number} */
			dataWords[(nBitsLeft + 64 >>> 9 << 4) + 15] = nBitsTotal;
			/** @type {number} */
			data.sigBytes = 4 * dataWords.length;
			this._process();
			return this._hash;
		},
		/**
		 * @return {?}
		 */
		clone: function () {
			var clone = Hasher.clone.call(this);
			clone._hash = this._hash.clone();
			return clone;
		}
	});
C.SHA256 = Hasher._createHelper(SHA512);
C.HmacSHA256 = Hasher._createHmacHelper(SHA512);
var CryptoJS = err;
var _ = CryptoJS.lib.WordArray;
CryptoJS.enc.Base64 = {
	/**
	 * @param {Array} key
	 * @return {?}
	 */
	stringify: function (key) {
		var buf = key.words;
		var len = key.sigBytes;
		var map = this._map;
		key.clamp();
		/** @type {Array} */
		key = [];
		/** @type {number} */
		var i = 0;
		for (; i < len; i += 3) {
			/** @type {number} */
			var f = (buf[i >>> 2] >>> 24 - i % 4 * 8 & 255) << 16 | (buf[i + 1 >>> 2] >>> 24 - (i + 1) % 4 * 8 & 255) << 8 | buf[i + 2 >>> 2] >>> 24 - (i + 2) % 4 * 8 & 255;
			/** @type {number} */
			var HOUR = 0;
			for (; 4 > HOUR && i + 0.75 * HOUR < len; HOUR++) {
				key.push(map.charAt(f >>> 6 * (3 - HOUR) & 63));
			}
		}
		if (buf = map.charAt(64)) {
			for (; key.length % 4; ) {
				key.push(buf);
			}
		}
		return key.join("");
	},
	_map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",
	/**
	 * @param {string} chars
	 * @return {?}
	 */
	parse: function (chars) {
		var numChars = chars.length;
		var map = this._map;
		var other = map.charAt(64);
		if (other) {
			other = chars.indexOf(other);
			if (-1 != other) {
				numChars = other;
			}
		}
		/** @type {Array} */
		other = [];
		/** @type {number} */
		var title = 0;
		/** @type {number} */
		var i = 0;
		for (; i < numChars; i++) {
			if (i % 4) {
				/** @type {number} */
				var b1 = map.indexOf(chars.charAt(i - 1)) << i % 4 * 2;
				/** @type {number} */
				var b2 = map.indexOf(chars.charAt(i)) >>> 6 - i % 4 * 2;
				other[title >>> 2] |= (b1 | b2) << 24 - title % 4 * 8;
				title++;
			}
		}
		return _.create(other, title);
	}
};

function hashAlg(result, keepData, n) {
	result.sort(function (obj, p) {
		var a;
		var b;
		if ("object" === typeof obj && ("object" === typeof p && (obj && p))) {
			return a = obj.key,
			b = p.key,
			a === b ? 0 : typeof a === typeof b ? a < b ? -1 : 1 : typeof a < typeof b ? -1 : 1;
		}
		throw "error";
	});
	/** @type {number} */
	var c = 0;
	for (; c < result.length; c++) {
		var i = result[c].key.replace(RegExp("%", "gm"), "");
		/** @type {string} */
		var v = "";
		v = "string" == typeof result[c].value ? result[c].value.replace(RegExp("%", "gm"), "") : result[c].value;
		if ("" !== v) {
			n += i + v;
			keepData += "&" + (void 0 == groupedSelectors[i] ? i : groupedSelectors[i]) + "=" + v;
		}
	}
	result = pad(n);
	n = result.length;
	c = result.split("");
	/** @type {number} */
	i = 0;
	for (; i < parseInt(n / 2); i++) {
		if (0 == i % 2) {
			v = result.charAt(i);
			c[i] = c[n - 1 - i];
			c[n - 1 - i] = v;
		}
	}
	result = c.join("");
	result = pad(result);
	result = pad(result);

	n = "";
	c = result.length - 1;
	for (; 0 <= c; c--) {
		n += result.charAt(c);
	}
	
	n = err.SHA256(n).toString(err.enc.Base64);
	return KV(keepData, n);
}

function Test() {
	// var userAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36";
	var userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:67.0) Gecko/20100101 Firefox/67.0";//TODO
	var scrHeight = 1080;
	var scrWidth = 1920;
	var scrAvailHeight = 1040;
	var scrAvailWidth = scrWidth;
	var colorDepth = 24;

	var bucket = [];
	bucket.push(KV("cookieCode", "FGGL0-O5s6AoRG9XXAM37HtL-VdrEsSd"));//TODO
	bucket.push(KV("userAgent", userAgent));
	bucket.push(KV("scrHeight", scrHeight.toString()));
	bucket.push(KV("scrWidth", scrWidth.toString()));
	bucket.push(KV("scrAvailHeight", scrAvailHeight.toString()));
	bucket.push(KV("scrAvailWidth", scrAvailWidth.toString()));
	bucket.push(KV("scrColorDepth", colorDepth.toString()));
	bucket.push(KV("scrDeviceXDPI", ""));
	bucket.push(KV("appCodeName", "Mozilla"));
	bucket.push(KV("appName", "Netscape"));
	bucket.push(KV("javaEnabled", "0"));
	bucket.push(getMimeTypes()); //mimeTypes;e237f9703f53d448d77c858b634154a5
	bucket.push(KV("os", "MacIntel"));
	bucket.push(KV("appMinorVersion", ""));
	bucket.push(KV("browserLanguage", "zh-CN"));
	bucket.push(KV("cookieEnabled", "1"));
	bucket.push(KV("cpuClass", ""));
	bucket.push(KV("onLine", "true"));
	bucket.push(KV("systemLanguage", ""));
	bucket.push(KV("userLanguage", ""));
	bucket.push(KV("timeZone", -8));
	bucket.push(KV("flashVersion", "32.0 r0"));
	bucket.push(KV("historyList", 1));
	bucket.push(KV("custID", "133"));
	bucket.push(KV("platform", "WEB"));

	var o2 = [];
	o2.push(KV("user_agent", userAgent.replace(RegExp("/", "gm"), ""))); // "Mozilla5.0 (Windows NT 6.1; Win64; x64) AppleWebKit537.36 (KHTML, like Gecko) Chrome63.0.3239.108 Safari537.36"));
	o2.push(KV("language", "zh-CN"));
	o2.push(KV("color_depth", colorDepth));
	o2.push(KV("pixel_ratio", 1));
	o2.push(KV("resolution", new Array(scrWidth, scrHeight)));
	o2.push(KV("available_resolution", new Array(scrAvailWidth, scrAvailHeight)));
	o2.push(KV("timezone_offset", -480));
	o2.push(KV("session_storage", 1));
	o2.push(KV("local_storage", 1));
	o2.push(KV("indexed_db", 1));
	o2.push(KV("open_database", 1));
	o2.push(KV("cpu_class", "unknown"));
	o2.push(KV("navigator_platform", "Win32"));
	o2.push(KV("do_not_track", "unknown"));
	o2.push(KV("regular_plugins", new Array("Chrome PDF Plugin::Portable Document Format::application/x-google-chrome-pdf~pdf",
				"Chrome PDF Viewer::::application/pdf~pdf",
				"Native Client::::application/x-nacl~,application/x-pnacl~",
				"Widevine Content Decryption Module::Enables Widevine licenses for playback of HTML audio/video content. (version: 1.4.8.1029)::application/x-ppapi-widevine-cdm~")));
	o2.push(KV("canvas", "canvas winding:yes~canvas fp:"));
	o2.push(KV("webgl", "~extensions:ANGLE_instanced_arrays;EXT_blend_minmax;EXT_color_buffer_half_float;EXT_disjoint_timer_query;EXT_frag_depth;EXT_shader_texture_lod;EXT_texture_filter_anisotropic;WEBKIT_EXT_texture_filter_anisotropic;EXT_sRGB;OES_element_index_uint;OES_standard_derivatives;OES_texture_float;OES_texture_float_linear;OES_texture_half_float;OES_texture_half_float_linear;OES_vertex_array_object;WEBGL_color_buffer_float;WEBGL_compressed_texture_s3tc;WEBKIT_WEBGL_compressed_texture_s3tc;WEBGL_compressed_texture_s3tc_srgb;WEBGL_debug_renderer_info;WEBGL_debug_shaders;WEBGL_depth_texture;WEBKIT_WEBGL_depth_texture;WEBGL_draw_buffers;WEBGL_lose_context;WEBKIT_WEBGL_lose_context~webgl aliased line width range:[1, 1]~webgl aliased point size range:[1, 1024]~webgl alpha bits:8~webgl antialiasing:yes~webgl blue bits:8~webgl depth bits:24~webgl green bits:8~webgl max anisotropy:16~webgl max combined texture image units:32~webgl max cube map texture size:16384~webgl max fragment uniform vectors:1024~webgl max render buffer size:16384~webgl max texture image units:16~webgl max texture size:16384~webgl max varying vectors:30~webgl max vertex attribs:16~webgl max vertex texture image units:16~webgl max vertex uniform vectors:4096~webgl max viewport dims:[16384, 16384]~webgl red bits:8~webgl renderer:WebKit WebGL~webgl shading language version:WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)~webgl stencil bits:0~webgl vendor:WebKit~webgl version:WebGL 1.0 (OpenGL ES 2.0 Chromium)~webgl vertex shader high float precision:23~webgl vertex shader high float precision rangeMin:127~webgl vertex shader high float precision rangeMax:127~webgl vertex shader medium float precision:23~webgl vertex shader medium float precision rangeMin:127~webgl vertex shader medium float precision rangeMax:127~webgl vertex shader low float precision:23~webgl vertex shader low float precision rangeMin:127~webgl vertex shader low float precision rangeMax:127~webgl fragment shader high float precision:23~webgl fragment shader high float precision rangeMin:127~webgl fragment shader high float precision rangeMax:127~webgl fragment shader medium float precision:23~webgl fragment shader medium float precision rangeMin:127~webgl fragment shader medium float precision rangeMax:127~webgl fragment shader low float precision:23~webgl fragment shader low float precision rangeMin:127~webgl fragment shader low float precision rangeMax:127~webgl vertex shader high int precision:0~webgl vertex shader high int precision rangeMin:31~webgl vertex shader high int precision rangeMax:30~webgl vertex shader medium int precision:0~webgl vertex shader medium int precision rangeMin:31~webgl vertex shader medium int precision rangeMax:30~webgl vertex shader low int precision:0~webgl vertex shader low int precision rangeMin:31~webgl vertex shader low int precision rangeMax:30~webgl fragment shader high int precision:0~webgl fragment shader high int precision rangeMin:31~webgl fragment shader high int precision rangeMax:30~webgl fragment shader medium int precision:0~webgl fragment shader medium int precision rangeMin:31~webgl fragment shader medium int precision rangeMax:30~webgl fragment shader low int precision:0~webgl fragment shader low int precision rangeMin:31~webgl fragment shader low int precision rangeMax:30"));
	o2.push(KV("adblock", "0"));
	o2.push(KV("has_lied_languages", false));
	o2.push(KV("has_lied_resolution", false));
	o2.push(KV("has_lied_os", false));
	o2.push(KV("has_lied_browser", false));
	o2.push(KV("touch_support", new Array(0, false, false)));
	o2.push(KV("js_fonts", new Array("Arial", "Arial Black", "Arial Narrow", "Arial Unicode MS", "Book Antiqua", "Bookman Old Style", "Calibri", "Cambria", "Cambria Math", "Century", "Century Gothic", "Comic Sans MS", "Consolas", "Courier", "Courier New", "Garamond", "Georgia", "Helvetica", "Impact", "Lucida Bright", "Lucida Calligraphy", "Lucida Console", "Lucida Fax", "Lucida Handwriting", "Lucida Sans Unicode", "Microsoft Sans Serif", "Monotype Corsiva", "MS Gothic", "MS PGothic", "MS Reference Sans Serif", "MS Sans Serif", "MS Serif", "Palatino Linotype", "Segoe Print", "Segoe Script", "Segoe UI", "Segoe UI Light", "Segoe UI Semibold", "Segoe UI Symbol", "Tahoma", "Times", "Times New Roman", "Trebuchet MS", "Verdana", "Wingdings", "Wingdings 2", "Wingdings 3")));

	var moreInfoArray = [];
	moreInfoArray.push(KV("webSmartID", getWebSmartID(o2))); //webSmartID;718f892be8f4c1333b4862bf74eb108b

	for (var i = 0; i < o2.length; i++) {
		var result = o2[i].key;
		var until = o2[i].value + "";
		switch (result) {
		case "session_storage":
			moreInfoArray.push(getSessionStorage(until));
			break;
		case "local_storage":
			moreInfoArray.push(getLocalStorage(until));
			break;
		case "indexed_db":
			moreInfoArray.push(getIndexedDb(until));
			break;
		case "open_database":
			moreInfoArray.push(getOpenDatabase(until));
			break;
		case "do_not_track":
			moreInfoArray.push(getDoNotTrack(until));
			break;
		case "ie_plugins":
			moreInfoArray.push(getPlugins(until));
			break;
		case "regular_plugins":
			moreInfoArray.push(getPlugins(""));
			break;
		case "adblock":
			moreInfoArray.push(getAdblock(until));
			break;
		case "has_lied_languages":
			moreInfoArray.push(getHasLiedLanguages(until));
			break;
		case "has_lied_resolution":
			moreInfoArray.push(getHasLiedResolution(until));
			break;
		case "has_lied_os":
			moreInfoArray.push(getHasLiedOs(until));
			break;
		case "has_lied_browser":
			moreInfoArray.push(getHasLiedBrowser(until));
			break;
		case "touch_support":
			moreInfoArray.push(getTouchSupport(until));
			break;
		case "js_fonts":
			moreInfoArray.push(getJsFonts(until));
		}
	}
	bucket = bucket.concat(moreInfoArray);
	bucket.sort(function (obj, p) {
		var a;
		var b;
		if ("object" === typeof obj && ("object" === typeof p && (obj && p))) {
			return a = obj.key,
			b = p.key,
			a === b ? 0 : typeof a === typeof b ? a < b ? -1 : 1 : typeof a < typeof b ? -1 : 1;
		}
		throw "error";
	});

	var sorted = "appCodeName appMinorVersion appName cpuClass onLine systemLanguage userLanguage historyList hasLiedLanguages hasLiedResolution hasLiedOs hasLiedBrowser".split(" ");
	var keys = ["sessionStorage", "localStorage", "indexedDb", "openDatabase"];
	var _path = ["scrAvailWidth", "scrAvailHeight"];
	var c = "192.168.0.131";
	var v = bucket;
	var p = [];
	var val = [];
	var vals = [];
	var options = [];
	var j = 0;
	for (; j < v.length; j++) {
		if ("new" != v[j].value) {
			if (-1 == sorted.indexOf(v[j].key)) {
				if (-1 != keys.indexOf(v[j].key)) {
					val.push(v[j]);
				} else {
					if (-1 != _path.indexOf(v[j].key)) {
						vals.push(v[j]);
					} else {
						if (-1 != blackList.indexOf(v[j].key)) {
							options.push(v[j]);
						} else {
							p.push(v[j]);
						}
					}
				}
			}
		}
	}
	v = "";
	j = 0;
	for (; j < val.length; j++) {
		v = v + val[j].key.charAt(0) + val[j].value;
	}
	val = "";
	j = 0;
	for (; j < options.length; j++) {
		val = 0 == j ? val + options[j].value : val + "x" + options[j].value;
	}
	options = "";
	j = 0;
	for (; j < vals.length; j++) {
		options = 0 == j ? options + vals[j].value : options + "x" + vals[j].value;
	}
	// p.push(KV("storeDb", v));
	p.push(KV("storeDb", "i1l1s1"));//TODO
	p.push(KV("srcScreenSize", val));
	p.push(KV("scrAvailSize", options));
	if ("" != c) {
		p.push(KV("localCode", parseColor(c)));
	}
	var key = "";
	var data = "";
	data = hashAlg(p, key, data);
	key = data.key;
	data = data.value;
	key += "&timestamp=" + (new Date).getTime();
	return "/otn/HttpZF/logdevice" + ("?algID=%s&hashCode=" + data + key);
}
/* 	}
} */
